package com.classAnnotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-02-07
 * Time: 21:34
 */

@Controller
public class UserController {

    // 当同一个类型 使用多次 @Bean 时, 会出现问题
    // 解决一:
    // 不用@Autowired 用 @Resource (name =""),来指明注入哪个类
    // @Autowired 能用 注入方法一二三, 而@Resource 只能一三,不能构造方法注入, 他们两个区别不大
    // @Resource(name="u1")
    // @Resource(name="getUser2")
    // private User user;

    // 解决二:
    // @Autowired + @Qualifier
    @Autowired
    @Qualifier(value="getUser2")
    private User user;


    private UserComponent userComponent;
    private UserRepository userRepository;

    /**
     * 为了演示  spring 中存储的类默认是单例的
     * @return
     */
    public User getUser(){
        user.setName("修改了");
        return user;
    }

    // 注入 : 即从 spring 中获取 bean

    // 注入方法 一 :
    // 属性注入(最简单的注入)
    @Autowired
    private UserService userService;
    public User getUser1(){
        return userService.getUser(5, "Controller 属性注入获取");
    }

    // 注入方法 二:
    // 构造方法注入  (spring 之前推荐)
    @Autowired  // 如果只有一个构造方法可以不写注解, 但有多个则需写, 写明使用哪个构造函数注入
    public UserController(UserComponent userComponent){
        this.userComponent= userComponent;
    }

    public User getUser2(){
        return userComponent.getUser(6, "Controller 构造方法注入获取");
    }

    // 注入方法 三:
    // setter注入  (spring 现在推荐)
    @Autowired
    public void setUserRepository(UserRepository userRepository){
        this.userRepository=userRepository;
    }
    public User getUser3(){
        return userRepository.getUser(7, "Controller setter注入获取");
    }


    public void display(){
        System.out.println("@Controller");
    }
}
